/* fcntltest.c */
#include <stdio.h> // 包含标准输入输出头文件
#include <sys/types.h> // 包含系统类型定义头文件
#include <unistd.h> // 包含POSIX操作系统API的头文件
#include <fcntl.h> // 包含文件控制选项的头文件
#include <string.h>

int main() {
    int flags; // 声明一个整型变量flags，用于存储文件状态标志
    int append_flag; // 声明一个整型变量append_flag，用于存储追加标志（但此变量在代码中未使用）
    int nonblock_flag; // 声明一个整型变量nonblock_flag，用于存储非阻塞标志（但此变量在代码中未使用）
    int access_mode; // 声明一个整型变量access_mode，用于存储访问模式（但此变量在代码中未使用）
    int file_descriptor; // 声明一个整型变量file_descriptor，用于存储文件描述符

    /* File Descriptor 初始化部分有误，应为 int file_descriptor; 已在上方声明 */

    char *text1 = "abcdefghij"; // 声明并初始化一个字符指针text1，指向字符串"abcdefghij"
    char *text2 = "0123456789"; // 声明并初始化一个字符指针text2，指向字符串"0123456789"
    char readbuffer‌[25]; // 声明一个字符数组read_buffer，大小为25，用于存储读取的文件内容
    memset(readbuffer‌, '\0', 25); // 使用memset函数将read_buffer的所有字节初始化为'\0'

    // 创建文件"testfile"，权限为S_IRWXU（用户读写执行权限），返回文件描述符存储在file_descriptor中
    file_descriptor = creat("testfile", S_IRWXU);
    // 向文件中写入text1指向的内容，长度为10
    write(file_descriptor, text1, 10);
    // 关闭文件描述符
    close(file_descriptor);

    /* 以读写方式打开文件"testfile" */
    file_descriptor = open("testfile", O_RDWR);
    // 从文件中读取内容到read_buffer，长度为24
    read(file_descriptor, readbuffer‌, 24);
    // 打印第一次读取的内容
    printf("first read is '%s'\n", readbuffer‌);

    /* 将文件指针重置到文件开头 */
    lseek(file_descriptor, 0, SEEK_SET);

    /* 设置追加标志，防止覆盖现有文本 */
    fcntl(file_descriptor, F_SETFL, O_APPEND);
    // 向文件中追加写入text2指向的内容，长度为10
    write(file_descriptor, text2, 10);

    // 将文件指针再次重置到文件开头
    lseek(file_descriptor, 0, SEEK_SET);
    // 从文件中再次读取内容到read_buffer，长度为24
    read(file_descriptor, readbuffer‌, 24);
    // 注意：这里的printf语句中字符串格式化有误，应为"second read is '%s'\n"
    printf("second read is '%s'\n", readbuffer‌);

    // 关闭文件描述符
    close(file_descriptor);
    // 删除文件"testfile"
    unlink("testfile");

    return 0;
}

